
/*板卡有关SPI的操作：
1. CELL接口。!!没有中断引脚。
2. DAC接口。
*/
#include "stm32l4xx.h"
#include "stm32l4xx_ll_bus.h"
#include "stm32l4xx_ll_gpio.h"
#include "stm32l4xx_ll_spi.h"
#include "cmsis_os2.h"

#define bsp_spi_adc_tim_IRQHandler					TIM2_IRQHandler

typedef struct _ADC_STA{
	uint8_t is_cont;		//1---在连续模式，0---不在连续模式。
	uint8_t stop_cont;	//1---要停止连续模式, 0---正常
}ADC_STA;

ADC_STA adc_sta={0};


/*执行推出ADC连续模式，正常退出，返回0。
如果ADC处于连续模式，则执行退出连续模式的方法。
*/
uint32_t adc_stop_cont_mode(void)
{
		if(1 == adc_sta.is_cont){
			adc_sta.stop_cont= 1;	//准备停止连续模式，需要在下次中断读取时，设置SDI为0xFF。
		}
		else{
			return 0;	//正常
		}
		
		int stop_tmo= 10;
		while(adc_sta.stop_cont && stop_tmo){	//等待退出
			osDelay(10);
			stop_tmo--;
		}
		
		if(stop_tmo)
			return 0;
		else
			return 1;		//C 错误
}


/*配置CS5530用到的SPI引脚&功能。
!!没有片选CS（硬件上，CS5530's CS常低）。
!!飞线将PA15和SPI3_SDO相连，使能PA15的下降沿触发中断方式，这样能避免将SPI3_SDO在AF和GPIO间相互切换。
当连续模式下，完成一次转换，SDO由高变低。PA15触发中断。在PA15的ISR，读取本次转换结果，并放入一个环形FIFO。
*/
void bsp_spi_adc_hal_init(void)
{
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3);
	
	/*
	SPI3MOSI	Pin53/PC12	MOSI
	SPI3MISO	Pin52/PC11	MISO
	SPI3SCK	Pin51/PC10	SCK
	*/
	LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_12, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_12, LL_GPIO_AF_6);				//C AF6 as SPI3_MOSI.

	LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_11, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_11, LL_GPIO_AF_6);				//C AF6 as SPI3_MISO.
	
	LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_10, LL_GPIO_AF_6);				//C AF6 as SPI3_SCK.
	
	
	/*SPI3配置：
	mode:
	speed:
	*/
	LL_SPI_SetBaudRatePrescaler(SPI3, LL_SPI_BAUDRATEPRESCALER_DIV4);	//CR1
	LL_SPI_SetClockPhase(SPI3, LL_SPI_PHASE_1EDGE);										//CR1
	LL_SPI_SetClockPolarity(SPI3, LL_SPI_POLARITY_LOW);								//CR1
	LL_SPI_SetDataWidth(SPI3, LL_SPI_DATAWIDTH_8BIT);									//CR2
	LL_SPI_SetTransferBitOrder(SPI3, LL_SPI_MSB_FIRST);								//CR1
	LL_SPI_SetTransferDirection(SPI3, LL_SPI_FULL_DUPLEX);						//CR1
	LL_SPI_SetMode(SPI3, LL_SPI_MODE_MASTER);
	
	
}



/*配置DAC7760用到的SPI引脚&功能。
*/
void bsp_spi_dac_hal_init(void)
{
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
	LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
	
	/*
	SPI2_MOSI	Pin36/PB15	SPI2的MOSI，输出，和电源板上DAC7760相连。
	SPI2_MISO	Pin35/PB14	SPI2的MISO，输入，和电源板上DAC7760相连。
	SPI2_SCK	Pin34/PB13	SPI2的SCK，输出，和电源板上DAC7760相连。
	SPI2_LATCH	Pin33/PB12	SPI2的CS。	
	*/
	LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_15, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOB, LL_GPIO_PIN_15, LL_GPIO_AF_5);				//C AF5 as SPI2.

	LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_14, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOB, LL_GPIO_PIN_14, LL_GPIO_AF_5);				//C AF5 as SPI2.	
	
	LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_13, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOB, LL_GPIO_PIN_13, LL_GPIO_AF_5);				//C AF5 as SPI2.
	
	LL_GPIO_SetPinOutputType(GPIOB, LL_GPIO_PIN_12,LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_12, LL_GPIO_MODE_OUTPUT);
	LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_12);	//C CS默认为H。
	
	/*SPI2配置：
	mode:
	speed:
	*/
}


/*配置ADC芯片：
*/
void bsp_spi_adc_init(void)
{

}


/*配置定时读取ADC的TIM。
定时由：120次/秒，480次/秒，960次/秒。
CS5530在单次转换下转换时间是连续转换下的4~6倍，所以，在精度保证的前提下，应该使用连续模式。
且按WR配置时，例120sps,单次转换时间约为35ms，那么1秒内只能转换约28次。
*/
void bsp_spi_adc_tim_init(uint32_t hz)
{
	
	if(120 ==hz){
	
	}
	else if(480 ==hz){
	
	}
	else{// 960
	
	}

}


void bsp_spi_adc_tim_IRQHandler(void)
{

}

/*配置DAC芯片：电流模式或电压模式。
*/
void bsp_spi_dac_init(uint32_t mode)
{

}


/*
*/
void bsp_spi_dac_V(uint32_t val)
{

}

/*
*/
void bsp_spi_dac_I(uint32_t val)
{

}

/************************ END OF FILE ************************/
